package writtenTraining.day31;

import java.util.*;

/**
 * day31:(1)优先级队列 + 贪心 ：小红的口罩
 */

public class Main {
    public static void main(String[] args) {
//         优先级队列 + 贪心 
            // 输入数据
        Scanner in = new Scanner(System.in);
        int n = in.nextInt() , k = in.nextInt();
//         建立一个小根堆
        PriorityQueue<Integer> queue = new PriorityQueue<>((a,b)->a.compareTo(b));
        for(int i = 0; i < n; i++) {
            queue.add(in.nextInt());
        }
        
        // 整合
        int ret = 0, sum = 0;    
        while(ret <= k) {
            int num = queue.poll();
            if(sum + num <= k) {
//                 统计数据
                sum += num;
                ret++;
//                 返回堆
                queue.add(num * 2);
            }  else {
                break;
            }  
        }
        
        // 输出数据
        System.out.println(ret);
    }
}

/**
 * day31:(2)枚举 + 模拟（时间没通过）：春游
 */

class Main2 {
    public static void main(String[] args) {
//         枚举 + 模拟 (抽离出来的价值)
        // 输入数据
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();

        while(T-- > 0) {
            long n = in.nextLong(), a = in.nextLong(), b = in.nextLong();
            long ret = 0x3f3f3f3f,tar = 0, tn = n;
            // 优先选 a , 剩下选 b
            for(int i = 0; i <= (n / 2 + (n % 2 == 0 ? 0 : 1) ); i++) {
                tn = n;
                tar = 0;
                // 统计 a
                tar += (a * i);
                tn -= i * 2;

//                 看是否还有剩余 加入到 b 中
                if(tn > 0) {
                    tar += ((tn / 3 + (tn % 3 == 0 ? 0 : 1)) * b);
                }

//                 更新结果
                ret = Math.min(ret,tar);
            }

            // 优先计算 b , 剩下选 a
            for(int i = 0; i <= (n / 3 + (n % 3 == 0 ? 0 : 1) ); i++) {
                tn = n;
                tar = 0;
                // 统计 b
                tar += (b * i);
                tn -= i * 3;

//                 看是否还有剩余, 加入到 a 中
                if(tn > 0) {
                    tar += ((tn / 2 + (tn % 2 == 0 ? 0 : 1)) * b);
                }

//                 更新结果
                ret = Math.min(ret,tar);
            }

//             输出结果
            System.out.println(ret);
        }
    }
}

/**
 * day31(2)分类讨论 + 模拟；春游
 */

 class Main4 {
    public static void main(String[] args) {
//         分类讨论 + 模拟 (抽离出来的价值)
        // 输入数据
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();

        while(T-- > 0) {
            long n = in.nextLong(), a = in.nextLong(), b = in.nextLong();
            long ret = 0;
            // 分情况 a 平均多还是 b 多？
            if(a * 3 > b * 2) {
                // 特殊情况判断
                if (n < 3) {
                    System.out.println(b);
                    continue;
                }
//                 先统计完全装下的情况
                ret += ((n / 3) * b);
                // 然后讨论余数
                long tmp = n % 3;
                long min = Math.min(a,b);
                if(tmp == 1) {
//                     加前面三个重新组合成4个
                    min = Math.min(min,2 * a - b);
                    ret += min;
                } else if(tmp == 2) {
//                     加前面三个重新组合成五个
                    min = Math.min(min,3 * a - b);
                    ret += min;
                }
            } else {
                if (n < 2) {
                    System.out.println(a);
                    continue;
                }
                //                 先统计完全装下的情况
                ret += ((n / 2) * a);
                // 然后讨论余数
                long tmp = n % 2;
                long min = Math.min(a,b);
                if(tmp == 1) {
//                     加上前面的两个重新组合成三个
                    min = Math.min(min, b - a);
                    ret += min;
                }
            }


//             输出结果
            System.out.println(ret);
        }
    }
}

/**
 * day31:(3)动态规划+ 01背包：DP59 数位染色
 */


 class Main3 {
    public static void main(String[] args) {
        // 动态规划 + 01背包问题

        // 输入数据
        Scanner in = new Scanner(System.in);
        char[] str = in.next().toCharArray();
        int len = str.length;

        int sum = 0;
        for(int i = 0; i < len; i++) {
            sum +=  (int)(str[i] - '0');
        }

        if(sum % 2 == 1) {
            System.out.println("No");
        } else {
            int tar = sum / 2;
            // 创建dp
            int[] dp = new int[tar + 1];

            // 初始化

            for(int i = 1 ; i <= len; i++) {
                int num = (int)(str[i - 1] - '0');
                for(int j = tar; j >= num; j--) {
                    // 看前面是否能装下
                    dp[j] = Math.max(dp[j], dp[j - num] + num);
                }
            }

            // 输出结果
            System.out.println(dp[tar] == tar ? "Yes" : "No");
        }
    }
}